from datetime import datetime, time
from itertools import count
from flask import Blueprint,request,jsonify
import requests,datetime
from conf.comm import sqlalchemy_context
from database import *
import json,re,random,time
from utils.rediscon import RedisCon
#容联云发送信息包
from conf.comm import send_message
from werkzeug.security import generate_password_hash,check_password_hash
#蓝图初始化
bp_users = Blueprint('users',__name__)

#注册功能实现
@bp_users.route('/reg/',methods=['POST'])
@sqlalchemy_context()
def reg():
    #获取vue信息
    data = request.data
    if not data:
        data  = request.form
    else:
        data = json.loads(request.data)

    #正则验证
    res = re.match('^1[3-9][0-9]{9}$',data['mobile'])
    if not res:
        return jsonify({'code':11111,'msg':'手机号不合法'})

    #向数据库提交数据
    try:
        user = User(username=data['username'],password=generate_password_hash(data['password']),mobile=data['mobile'])
        db.session.add(user)
        db.session.commit()
        return jsonify({'code':200,'msg':'注册成功'})
    except:
        return jsonify({'code':20020,'msg':'用户已从在'})
    
#手机短信接口
@bp_users.route('/sendcode/',methods=["POST"])
@sqlalchemy_context()
def sendcode():

    #手机号登录获取验证码
    data = request.data
    if not data:
        data = request.form
    else:
        data =json.loads(request.data)
    mobile = data['mobile']
    
    # #判断数据是否有该手机号  不用l 手机号没有会注册
    # mob = User.query.filter_by(mobile=mobile).first()
    if not mobile:
        return jsonify({'code':10010,'msg':'该手机号未注册，请注册'})
    
    #生成验证码
    code = random.randint(100000,999999)

    #发送验证码码到手机
    flag = send_message(mobile,code,1)  #容联云时间是按分钟计算

    #如果发送成功了 保存在redis里 需要设置生命周期
    if flag:
        r = RedisCon() 
        r.set_str(mobile,code,300)  #redis 生命周期按秒计算 30 方便

        return jsonify({'code':200,'msg':'验证码发送成功，请注意接收','sendcode':code})

#登录接口
@bp_users.route('/login/',methods=["GET"])
@sqlalchemy_context()
def login():
    #用户名登录
    username = request.args.get('username')
    password = request.args.get('password')
    mobile = request.args.get('mobile')
    code = request.args.get('code')
    # print(username,password)
    # return 'ok'
    if username:
        #查询这个用户信息 
        user = User.query.filter_by(username=username).first()
        if user:
            if check_password_hash(user.password,password):
                #密码对 删除错误的信息记录
                Record.query.filter_by(username = username).delete()

                return jsonify({'code':200,'msg':'登录成功','userid':user.id,'username':user.username})
            else:
                #目前时间
                print('************************************************')
                day = datetime.datetime.now()
                print(day)
                #看看记录表错误有没有次数
                user = Record.query.filter_by(username = username).first()
                print(user)
                #如果没有用户就添加一个新记录
                if not user:
                    rec = Record(username=username,recordtime=day,count=1)
                    db.session.add(rec)
                    db.session.commit()
                #有数据修改 次数加一和时间更新
                else: 
                    #先判断时间 例如今天登录2次没上去不等了 然后等到24小时以后登录时间要归零 然后还有3次登录机会
                    if day.timestamp()/3600>user.recordtime.timestamp()/3600+24:
                        Record.query.filter_by(username=username).update({'count':0,'recordtime':day})
                    #没超过24小时 连续登录3次不让登录
                    if user.count <3:
                        Record.query.filter_by(username=username).update({'count':user.count+1})
                        db.session.commit()
                    elif user.count ==3:
                        return jsonify({'code':20060,'msg':'每天只有三次登录机会'})
                    
                        

                return jsonify({'code':20030,'msg':'用户名或密码错误'}) 
        else:
            return jsonify({'code':20020,'msg':'该用户不存在'})

    if mobile:    
        #手机号登录
        #获取前端验证码
        #获取后台验证码
        r=RedisCon()
        hcode = r.get_str(mobile)  #得到的是b开头的二进制数据
        print(hcode)
        if hcode:
            if int(code) == int(hcode):
                #写到数据库
                user = User.query.filter_by(mobile=mobile).first()
                if not user:
                    user = User(mobile=mobile,username=mobile)
                    db.session.add(user)
                    db.session.commit()
                r.del_str(mobile)
                return jsonify({'code':200,'msg':'登录成功','userid':user.id,'username':user.username})
            else:
                return jsonify({'code':20050,'msg':'验证码输入错误，请重新输入'})
        else:
            return jsonify({'code':20040,'msg':'验证码不存在'})
